package cn.ycc1.boot3task.task;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author ycc
 * @date 2025/10/28
 */
@Component
public class AsyncScheduledTasks {

    @Autowired
    private EmailTask emailTask;

    private static final DateTimeFormatter formatter =
            DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

    private final AtomicInteger emailCounter = new AtomicInteger(1);
    private final AtomicInteger dataCounter = new AtomicInteger(1);

    /**
     * 每10秒执行一次 - 发送批量邮件（异步）
     */
    @Scheduled(fixedRate = 10000)
    public void scheduledEmailTask() {
        String currentTime = LocalDateTime.now().format(formatter);
        System.out.println("=== 定时邮件任务触发 [" + currentTime + "] ===");

        // 同时发送5封邮件，使用不同的线程异步执行
        for (int i = 1; i <= 5; i++) {
            int emailId = emailCounter.getAndIncrement();
            emailTask.sendEmail(
                    "user" + emailId + "@example.com",
                    "测试邮件 " + emailId,
                    "这是一封测试邮件内容"
            );
        }
    }

    /**
     * 每15秒执行一次 - 批量数据处理（异步）
     */
    @Scheduled(fixedDelay = 15000)
    public void scheduledDataProcessing() {
        String currentTime = LocalDateTime.now().format(formatter);
        System.out.println("=== 定时数据处理任务触发 [" + currentTime + "] ===");

        // 同时处理3个数据批次，使用不同的线程异步执行
        for (int i = 1; i <= 3; i++) {
            int batchId = dataCounter.getAndIncrement();
            emailTask.processData(batchId);
        }
    }

    /**
     * 每分钟的第30秒执行 - 监控任务
     */
    // @Scheduled(cron = "30 * * * * ?")
    public void monitoringTask() {
        String currentTime = LocalDateTime.now().format(formatter);
        System.out.println("系统监控任务执行 [" + currentTime + "] - " +
                Thread.currentThread().getName());

        // 这里可以添加系统状态检查、日志清理等监控逻辑
        System.out.println("监控任务完成: 系统运行正常");
    }

    /**
     * 初始延迟5秒，然后每20秒执行一次 - 清理任务
     */
    //  @Scheduled(initialDelay = 5000, fixedRate = 20000)
    public void cleanupTask() {
        String currentTime = LocalDateTime.now().format(formatter);
        System.out.println("清理任务执行 [" + currentTime + "] - " +
                Thread.currentThread().getName());

        // 模拟清理操作
        try {
            Thread.sleep(1000); // 清理耗时1秒
            System.out.println("清理任务完成: 临时文件已清理");
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }
}

